package com.unsiv.blplayer.playtools;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Collections;

/**
 * <p>
 * 传送互联网码值时，数据格式为”IE” +4BYTES OID码 +”\r\n” 如传送码值为1011001(0x00f6d39)
 * 格式为：‘I’,’E’,00,0F,6d,39 ‘\r\n’ 00,0F,6d,39 = 无符号长整型 =示例为: 传送码值时，数据格式为”+OID”
 * +4BYTES OID码 +”\r\n” 如传送码值为1011001(0x00f6d39) 格式为：’+’,’O’‘I’,’D’,00,0F,6d,39
 * ‘\r\n’ 传送按键值时，数据格式为”+KEY” + 2 BYTES key 值 +”\r\n” 如传送码值为0x0001
 * 格式为：’+’,‘K’,’E’,’Y’,00,01, ‘\r\n’
 * 播放器端接到笔端发过来的指令后，返回”OK\r\n”，如果笔端64ms没有接到返回指令将再次发生码值
 * </p>
 * 
 * @author fanzhen
 * @time 10:24:29 PM Oct 4, 2011
 * @email fanzhen.meng@gmail.com
 */
public class Protocol {
	public static final String IEPre = "E"; // 网址前缀
	public static final String OIDPre = "OID";// OID前缀,播放指令
	public static final String KEYPre = "KEY"; // 按健值操作前缀
	public static final String OKPre = "OK"; // 正常应答响应
	public static final String DLPre = "DL"; // 文件下载

	public static byte[] getOKData() {
		byte[] retBytes = null;
		byte[] prefixBytes;
		try {
			prefixBytes = "OK".getBytes("ASCII");
			retBytes = new byte[prefixBytes.length + 2]; // 结束结束字符串\r\n;
			System.arraycopy(prefixBytes, 0, retBytes, 0, prefixBytes.length);
			retBytes[retBytes.length - 2] = 0x0d; // \r
			retBytes[retBytes.length - 1] = 0x0a; // \n
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return retBytes;
	}

	// public static String secString = XMLConfig.getValue("protocol",
	// "SecondByte"); // 读取二进制字符串

	public static byte[] CreateDemoData(String prefix) {
		byte[] retBytes = null;
		byte[] prefixBytes;
		try {
			prefixBytes = prefix.getBytes("ASCII");
			retBytes = new byte[prefixBytes.length + 2]; // 结束结束字符串\r\n;
			System.arraycopy(prefixBytes, 0, retBytes, 0, prefixBytes.length);
			retBytes[retBytes.length - 2] = 0x0d; // \r
			retBytes[retBytes.length - 1] = 0x0a; // \n
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return retBytes;
	}

	// / <summary>
	// / 获取测试模拟数据
	// / </summary>
	// / <param name="recvData"></param>
	// / <returns></returns>
	public static byte[] CreateDemoData(String prefix, Integer OID) {
		byte[] retBytes = null;
		byte[] prefixBytes;
		try {
			prefixBytes = prefix.getBytes("ASCII");
			byte[] oidBytes = ByteBuffer.allocate(4).putInt(OID).array();
			Collections.reverse(Arrays.asList(oidBytes));
			retBytes = new byte[prefixBytes.length + oidBytes.length + 2]; // 结束结束字符串\r\n;
			System.arraycopy(prefixBytes, 0, retBytes, 0, prefixBytes.length);
			System.arraycopy(oidBytes,0, retBytes,prefixBytes.length, oidBytes.length);
			retBytes[retBytes.length - 2] = 0x0d; // \r
			retBytes[retBytes.length - 1] = 0x0a; // \n
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return retBytes;

	}

	// / <summary>
	// / 数据预处理程序/是否有/b/r: 去掉/r/n结束符
	// / </summary>
	public static boolean FilterData(byte[] recvBytes) {
		boolean ret = false;
		int firstLoc = 0;
		int secLoc = 0;
		int len = recvBytes.length;
		for (int i = 0; i < len; i++) {
			byte a = recvBytes[i]; // \r
			if (a == 0x0d) {
				firstLoc = i;
				byte b = recvBytes[i + 1];
				if (b == 0x0a) // \n
				{
					secLoc = i + 1;
					break;
				}
			}
		}// for (int i = 0; i < recvBytes.Length; i++)

		if (firstLoc > 0 && secLoc > 0) { // 如果都有找到
			byte[] retByte = new byte[firstLoc];
			System.arraycopy(recvBytes, 0, retByte, 0, firstLoc);
			recvBytes = retByte;
			ret = true;
		}

		return ret;
	}

	// / <summary>
	// / 接收数据的处理
	// / </summary>
	// / <param name="recvBytes"></param>
	public static void RecvData(byte[] recvBytes) {
		String recvStr = new String( recvBytes);
		String okData = getOKData().toString();
		Integer oidCode = OIDConfig.GetOIDCode(recvBytes);
		if (recvStr.startsWith(okData)) // 正常应答响应
		{
			// OK操作
			return;
		}
		if (recvStr.startsWith(DLPre)) // 文件下载
		{
			// byte[] oidBytes = new byte[4];
			// Array.Copy(recvBytes, DLPre.Length, oidBytes, 0, 4);
			// Array.Reverse(oidBytes);
			// oidCode = BitConverter.ToUInt32(oidBytes, 0);
			// WebSite.DownloadFiles(oidCode);
			// return;
		}
		if (recvStr.startsWith(IEPre)) // 如果是IE
		{
			// byte[] oidBytes = new byte[4];
			// Array.Copy(recvBytes, IEPre.Length, oidBytes, 0, 4);
			// Array.Reverse(oidBytes);
			// oidCode = BitConverter.ToUInt32(oidBytes, 0);
			// WebSite.OpenPage(oidCode);
			// return;
		}
		if (recvStr.startsWith(KEYPre)) // 按健值操作前缀
		{
			// byte[] keyBytes = new byte[2];
			// Array.Copy(recvBytes, KEYPre.Length, keyBytes, 0, 2);
			// Array.Reverse(keyBytes);
			// UInt16 keyCode = BitConverter.ToUInt16(keyBytes, 0);
			// SoftKey.SoftKeyWork(keyCode);
			// return;
		}
		if (recvStr.indexOf(OIDPre) > -1) // OID前缀,播放指令
		{
//			byte[] oidBytes = new byte[4];// Store OID Code
//			System.arraycopy(recvBytes, OIDPre.length(), oidBytes, 0, 4);
//			ByteBuffer bb = ByteBuffer.wrap(oidBytes);
//			oidCode = bb.getInt();
		}
		// 根据OID的值做不同的操作 有声图书(大型MP3)
		if ((oidCode >= OIDConfig.BigMP3Min)
				&& (oidCode <= OIDConfig.BigMP3Max)) {
			// BigMP3Logic.BigMP3Work(oidCode);
			// //保存上一次个位码
			// if (GlobalConfig.G_MP3Player.oidCode >= 1000121 &&
			// GlobalConfig.G_MP3Player.oidCode <= 1000130)
			// {
			// GlobalConfig.G_MP3Player.lastBigBitOidCode = oidCode;
			// GlobalConfig.G_MP3Player.lastbitOrSegOid = oidCode;
			// }
			// //保存上一次声段
			// if (GlobalConfig.G_MP3Player.oidCode >= 1000131 &&
			// GlobalConfig.G_MP3Player.oidCode <= 1000140)
			// {
			// GlobalConfig.G_MP3Player.lastBigSegmentOidCode = oidCode;
			// GlobalConfig.G_MP3Player.lastbitOrSegOid = oidCode;
			// }
			// return;
		}

		// MP3处理
		if (oidCode >= OIDConfig.Mp3Min && oidCode <= OIDConfig.Mp3Max) {
			MP3Logic.MP3Work(oidCode);
			if (MP3Player.lastOidCode != oidCode) // 保存上一次的值
			{
				if (MP3Player.mp3Index <= MP3Player.getFileCount()) {
					MP3Player.lastOidCode = oidCode;
				}
				if (oidCode >= 1000401 && oidCode <= 1000450) // 存储录音格的 OID
				{
					MP3Player.cellOidCode = oidCode;
				}
			}
			return;
		}

		// REC
		if (oidCode >= 1000261 && oidCode <= OIDConfig.RecMax) {
			// RecordLogic.RECWork(oidCode);
			// return;
		}
		// 互联网
		if (oidCode >= OIDConfig.NetWorkingMin
				&& oidCode <= OIDConfig.NetWorkingMax) {

		}
		// 书名
		if (oidCode >= OIDConfig.BookNameMin
				&& oidCode <= OIDConfig.BookNameMax) {

		}
		// 选择书码/阅读BIN图书(
		if (oidCode >= OIDConfig.BookcodeMin
				&& oidCode <= OIDConfig.BookcodeMax) {
			// GlobalConfig.G_BooksPlayer.oidCode = oidCode;
			// GlobalConfig.G_BooksPlayer.PlayBooks();
			// return;
		}
		// 密码箱
		if (oidCode >= OIDConfig.PassBoxMin && oidCode <= OIDConfig.PassBoxMax) {
			// PasswordBox.PassboxWork(oidCode);
		}
		// 文件同步
		if (oidCode >= OIDConfig.FileSynchroMin
				&& oidCode <= OIDConfig.FileSynchroMax) {
			// FileSynchro.FileSynchroWork(oidCode);
		}
	}
}